home *** CD-ROM | disk | FTP | other *** search
/ Aminet 10 / aminetcdnumber101996.iso / Aminet / util / misc / ICookieRT.lha / IntuiCookie for Reqtools / IntuiCookie.c < prev    next >
C/C++ Source or Header  |  1995-12-17  |  6KB  |  199 lines

  1. #include <libraries/reqtools.h>
  2. #include <graphics/text.h>
  3. #include <clib/icon_protos.h>
  4. #include <stdio.h>
  5.  
  6. #define ENTSIZE             7L
  7. #define METACHAR            '%'
  8.  
  9. enum icookie_errors {ERR_NONE, ERR_INTUITION, ERR_ICON, ERR_DISKFONT, ERR_REQTOOLS, ERR_NOCOOKIEFILE, ERR_NOHASHFILE, ERR_COOKIEFILE, ERR_HASHFILE, ERR_FSEEK, ERR_NOENTRIES, ERR_NOFONT };
  10.  
  11. char *errors[] = { "",
  12.                    "Could not open Intuition.library V37+",
  13.                    "Could not open Icon.library V37+",
  14.                    "Could not open Diskfont.library V37+",
  15.                    "Could not open Reqtools.library",
  16.                    "No COOKIEFILE tooltype\nUse the Installer script to configure IntuiCookie!",
  17.                    "No HASHFILE tooltype\nUse the Installer script to configure IntuiCookie!",
  18.                    "Could not open COOKIEFILE\nCheck if you set the tooltypes correctly.",
  19.                    "Could not open HASHFILE\nCheck if you set the tooltype correctly.",
  20.                    "Fatal error: Could not calculate size of hashfile\nThis shouldn't occur :-(",
  21.                    "Wrong format:  Use '%%' as cookie separator\nRefer to the documentation for more information",
  22.                    "Could not find font\nCheck if you set the tooltypes correctly." };
  23.  
  24.  
  25. char *version[] = { "$VER: IntuiCookie for Reqtools 1.0 (17.12.95)", "IntuiCookie for Reqtools 1.0 ©1995 Christian Kemp"};
  26.  
  27. void fool_DICE( void ) { _waitwbmsg(); }
  28. #define main _main
  29.  
  30. struct Library * IconBase;
  31. struct DiskfontBase *DiskfontBase;
  32. extern struct Library *IntuitionBase;
  33. struct ReqToolsBase *ReqToolsBase;
  34.  
  35. struct TextAttr cfont_ta;
  36. struct TextFont *cfont_tt;
  37.  
  38. struct DiskObject *mydo;
  39.  
  40. FILE *cookiefile;
  41. FILE *hashfile;
  42.  
  43. char cookiebuffer[2048];
  44. BYTE *tooltype;
  45. int nentries, oneiwant, c, sawmeta = 0, i = 0, reqpos;;
  46. long cookiepos;
  47.  
  48. ULONG *seconds, *micros;
  49.  
  50. /**********/
  51.  
  52. static void init( void )
  53. {
  54.     if (!(IconBase = OpenLibrary("icon.library", 37)))
  55.         cleanup(ERR_ICON);
  56.     if (!(IntuitionBase = OpenLibrary("intuition.library", 37)))
  57.         cleanup(ERR_INTUITION);
  58.     if (!(DiskfontBase = OpenLibrary("diskfont.library", 37)))
  59.         cleanup(ERR_DISKFONT);
  60.     if (!(ReqToolsBase = OpenLibrary("reqtools.library", 38)))
  61.         cleanup(ERR_REQTOOLS);
  62.  
  63. }
  64.  
  65. /**********/
  66.  
  67. main()
  68. {
  69.  
  70.         init();
  71.  
  72.         mydo = GetDiskObject("PROGDIR:IntuiCookie");
  73.  
  74.         parse_tooltypes();
  75.  
  76.         get_cookienumber();
  77.  
  78.         while ((c = fgetc(cookiefile)) != EOF && sawmeta < 2)
  79.         {
  80.             switch ( c )
  81.             {
  82.                 case '\n':
  83.                     cookiebuffer[i++] = '\n';
  84.                     break;
  85.                 case METACHAR:
  86.                     if ((c = fgetc(cookiefile)) == METACHAR) sawmeta=+2;
  87.                     else
  88.                     {
  89.                         ungetc(c, cookiefile);
  90.                         cookiebuffer[i++] = '%';
  91.                     }
  92.                     break;
  93.                 case '@':
  94.                     c = fgetc(cookiefile);
  95.                     /* switch ( c )
  96.                     {
  97.                         default:
  98.                             cookiebuffer[i++] = c;
  99.                             break;
  100.                     } */
  101.                     break;
  102.                 case '\t':
  103.                     strcat(cookiebuffer, "    ");
  104.                     break;
  105.                 default:
  106.                     cookiebuffer[i++] = c;
  107.                     break;
  108.             }
  109.         }
  110.         cookiebuffer[--i] = '\0'; /* Kein unnützes \n am Ende eines Cookie */
  111.  
  112.         ULONG tags[] = { RT_TextAttr, &cfont_ta, RTEZ_ReqTitle, version[1], RT_ReqPos, reqpos, TAG_END };
  113.         rtEZRequest ( "%s", "Continue", NULL, (struct TagItem *)tags, cookiebuffer);
  114.  
  115.  
  116.         cleanup(ERR_NONE);
  117. }
  118.  
  119. /**********/
  120.  
  121. cleanup(UBYTE error)
  122. {
  123.  
  124.     if ( mydo )       FreeDiskObject( mydo );
  125.     if ( cookiefile ) fclose( cookiefile );
  126.     if ( hashfile )   fclose( hashfile );
  127.  
  128.     if ( IconBase ) CloseLibrary ( IconBase );
  129.     if ( ReqToolsBase) CloseLibrary ( ReqToolsBase );
  130.     if ( DiskfontBase ) CloseLibrary( DiskfontBase );
  131.  
  132.  
  133.  
  134.     if (error)
  135.     {
  136.         struct EasyStruct cookieES = {
  137.             sizeof (struct EasyStruct),
  138.             0,
  139.             "Error",
  140.             "%s" ,
  141.             "Continue",
  142.         };
  143.  
  144.         EasyRequest(NULL,&cookieES,NULL,errors[error]);
  145.  
  146.     }
  147.     if (IntuitionBase) CloseLibrary(IntuitionBase);
  148.     exit(0);
  149. }
  150.  
  151. parse_tooltypes()
  152. {
  153.  
  154.     if ((tooltype = FindToolType(mydo->do_ToolTypes, "COOKIEFILE")) == 0) cleanup(ERR_NOCOOKIEFILE);
  155.     if ((cookiefile = fopen(tooltype, "r")) == NULL) cleanup(ERR_COOKIEFILE);
  156.  
  157.     if ((tooltype = FindToolType(mydo->do_ToolTypes, "HASHFILE")) == 0) cleanup(ERR_NOHASHFILE);
  158.     if ((hashfile = fopen(tooltype, "r")) == NULL) cleanup(ERR_HASHFILE);
  159.  
  160.     if ((tooltype = FindToolType(mydo->do_ToolTypes, "COOKIEFONT")) != 0)
  161.     {
  162.         cfont_ta.ta_Name = tooltype;
  163.         tooltype = FindToolType(mydo->do_ToolTypes, "COOKIEFONTSIZE");
  164.         cfont_ta.ta_YSize = atoi(tooltype);
  165.         cfont_tt = OpenDiskFont(&cfont_ta);
  166.  
  167.         if (!cfont_tt) cleanup(ERR_NOFONT);
  168.  
  169.     }
  170.  
  171.     if (tooltype = FindToolType(mydo->do_ToolTypes, "REQPOS"));
  172.     {
  173.         if (MatchToolValue(tooltype,"POINTER") == TRUE) reqpos = REQPOS_POINTER;
  174.         if (MatchToolValue(tooltype,"TOPLEFT") == TRUE) reqpos = REQPOS_TOPLEFTSCR;
  175.         if (MatchToolValue(tooltype,"CENTER") == TRUE) reqpos = REQPOS_CENTERSCR;
  176.     }
  177.  
  178.  
  179. }
  180.  
  181.  
  182. /***** Get the size of the hashfile, compute a random number and set the
  183. /***** position we will read from according to this data *****/
  184. get_cookienumber()
  185. {
  186.  
  187.     if ( fseek ( hashfile, 0L, SEEK_END) != NULL ) cleanup(ERR_FSEEK);
  188.     nentries = ( ftell ( hashfile ) / ENTSIZE) -1;
  189.     if (nentries <= 0) cleanup(ERR_NOENTRIES);
  190.  
  191.     CurrentTime( &seconds, µs);
  192.     oneiwant = RangeRand(atoi(seconds) + micros) % nentries;
  193.  
  194.     fseek ( hashfile, ( long ) oneiwant * ENTSIZE, SEEK_SET );
  195.     fscanf ( hashfile, "%lx", &cookiepos );
  196.     fseek ( cookiefile, cookiepos, SEEK_SET);
  197.  
  198. }
  199.